/**
 * 倒计时插件。
 * 自动扫描class为countdown的标签，将其作为一个倒计时组件。
 * 默认参数： {
 *            maxlevel - 倒计时最高级别，默认为时
 *            minlevel - 倒计时最低级别，默认为秒
 *            endtime - 倒计时结束时间，毫秒数
 *            interval - 倒计时间隔，默认为minlevel
 *        }
 * 注意:
 *      1. 该版本月以上级别倒计数不准确，因为月份按30天计算，年份按12个月，每月30天计算
 *      2. 该版本默认倒计时的计算间隔按照配置参数minlevel为准，
 *         建议设置minlevel为"s"既"秒"为计算间隔，秒以上单位倒计时将存在误差，
 *         原因为倒计时计算的开始时间为页面刷新的时间，所以秒级别以上时间单位会存在时间计算时机的误差
 * @author dcy
 * @version 1.1
 * whatsnew:
 *     1.1 -> 支持同页面多个倒计时功能同时使用
 */
;(function($) {
    //默认配置参数
    var DEFAULT = {
        maxlevel : 'h',
        minlevel : 's',
        endtime : 0,
        interval : null
    };
    //时间各级别对应的毫秒数，用于倒计时计算
    var LEVEL_MS_MAP = {
        'ms' : 1,
        's'  : 1000,
        'mi' : 1000 * 60,
        'h'  : 1000 * 60 * 60,
        'd'  : 1000 * 60 * 60 * 24,
        'mo' : 1000 * 60 * 60 * 24 * 30,
        'y'  : 1000 * 60 * 60 * 24 * 30 * 24
    };
    //定义countdown插件
    $.fn.countdown = function(setting) {
    	return this.each(function() {
    		var $this = $(this), tagSetting = {};
            //获取标签上的参数
            $.each($this.data()||{}, function(name, value) {if(value) tagSetting[name] = value;});
            //合并参数，作用域大小比较：默认配置 < 标签配置 < 传递的参数配置
            var opts = $.extend({}, DEFAULT, tagSetting, setting);
            //获取每个倒计时元素的时间信息元素
            var children = {
                'y' : $this.find("[ct-y]"),
                'mo' : $this.find("[ct-mo]"),
                'd' : $this.find("[ct-d]"),
                'h' : $this.find("[ct-h]"),
                'mi' : $this.find("[ct-mi]"),
                's' : $this.find("[ct-s]"),
                'ms' : $this.find("[ct-ms]")
            };
            //首先计算一次剩余时间
            draw();
            //设置循环倒计时计算
            var t = setInterval(function() {draw();}, LEVEL_MS_MAP[opts.interval||opts.minlevel]);
            //倒计时计算方法
            function draw() {
            	var differ = parseInt(opts.endtime) - new Date().getTime();
                if(differ <= 0) {
                    $.each(children, function(level, wrapper) {wrapper.text('00');});
                    clearInterval(t);
                    return;
                }
                var isLower = false;
                $.each(children, function(level, wrapper) {
                    if(level == opts.maxlevel) isLower = true;
                    if(!isLower) return true;
                    var txt = parseInt(differ/LEVEL_MS_MAP[level])+"";
                    wrapper.text(txt.length == 1 ? "0"+txt : txt);
                    differ = differ%LEVEL_MS_MAP[level];
                    if(level == opts.minlevel) return false;
                });
            }
    	});
    };
    //文档加载完成后，为所有倒计时元素绑定倒计时插件，也可单独配置
    $(function() {
        $(".countdown").countdown();
    });
})(jQuery);
